16. 关于编程语言 Programming Language
本节的内容涉及到了一些核心的概念与思考问题的模型,请务必反复温习确保能够完全理解这些概念与模型背后的思想并能融会贯通在实际的开发过程中。
关于程序执行的编程语言,一个老生常谈的话题是:
- 机器语言:由一系列电路的高电平低电平信号(由 0 与 1 指代)组成,机器硬件直接执行并解释的指令。CPU 有一组固定的指令集,每一种指令都实际体现在 CPU 的电路中。机器指令直接操作特定内存的特定地址,几乎没有抽象层次可言。
- 高级语言:高级语言的代码由另一个程序解释执行(解释器)或编译为更低一层的语言(编译器)。高级语言存在诸多抽象机制。
毫无疑问,直接定义某种专注于某个类型或应用场景的语言是一种极为强大的抽象工具。
然而无论是哪种编程语言,其只由 语法(Syntax) 与 语义(Semantic) 两部分构成。语法规定了在该语言下哪些语句与表达式是合法的;而语义则描述了所有合法语句的执行或求值规则。
为了创建一种新的编程语言,我们需要:
- 编写一份正式、精确、全面的 规范文档,描述该语言的所有语法与语义。
- 构建一个该语言的解释器(广义,包括编译器)。
解释器对输入命令所做的第一步是 解析(Parsing),即将输入的字符先通过 词法分析(Lexical Analysis) 转换为 Token,将一个个 Token 通过 句法分析(Syntactic Analysis) 转换为代表表达式的抽象语法树。
如果我们从更高一层,从数学的视角来看,我们编写的一个又一个程序不过是一个 自动机(Automaton)。这些自动机接受一些参数作为输入,然后根据内部已经规定好的运行规则,对输入值做运算,并输出对应的结果。而解释器与编译器同样是一个自动机,但它是一个 输出自动机的自动机,也即,其接受一些程序代码作为输入,经过内部的运算后输出一个能够执行输入的程序代码所表示的运算逻辑的自动机。在这之中也蕴含了函数式编程的一个重要思想:函数是与其他数据结果一样的一等公民,同样可以赋值给某些变量,作为参数传入其它高阶函数或被它们作为返回值返回。